﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 舵机调试工具
{
    class SoverBaseSetting
    {
        public int minAngle = 0;            //最小角度
        public int maxAngle = 180;          //最大角度
        public int ID = 0;                  //ID号
        public int index = 0;               //在主界面的索引顺序（乱序排列时很有用）
        public string function = "作用1";   //舵机的功能
    }

    internal class SoverActivesSetting
    {
        private int _soverCount = 1;              //舵机数量
        public int soverCount
        {
            get
            {
                return _soverCount;
            }
            set
            {
                if (soverBaseSettings.Count != value)
                {
                    soverBaseSettings.Clear();
                    for (int i = 0; i < value; i++)
                    {
                        SoverBaseSetting baseSetting = new SoverBaseSetting();
                        baseSetting.index = i;
                        soverBaseSettings.Add(baseSetting);
                    }
                }
                _soverCount = value;
            }
        }

        //舵机基本信息的链表
        public List<SoverBaseSetting> soverBaseSettings = new List<SoverBaseSetting>() { new SoverBaseSetting() };

        //保存所有动作节点的链表
        //第一层list是保存所有的动作组，包含类似于“前进动作”、“后退动作”等名称
        //第二层list保存是某一个动作的所有子动作的名字，比如“前进动作”旗下所有子行为的名字“前进1”，“前进2”……
        //第二层list的第0个元素用于保存动作的名字，从第1个元素开始保存子动作名字
        public List<List<string>> sover_actives = new List<List<string>>();

        //保存所有动作节点的舵机角度
        //第一层list保存所有动作组
        //第二层list保存某个动作的子动作
        //第三层byte[]分别保存各个舵机的角度
        public List<List<int[]>> sover_allAngles = new List<List<int[]>>();

        public SoverActivesSetting(int maxSoverCount)
        {
            soverCount = maxSoverCount;
            sover_actives.Clear();

            List<string> one_active1 = new List<string>();      //新建动作组列表
            one_active1.Add("前进动作");                        //第一个字符串表示动作名字，后续字符串表示动作
            one_active1.Add("动作" + one_active1.Count);
            sover_actives.Add(one_active1);                     //把动作组列表添加到sover_actives链表中
            int[] angles1 = new int[maxSoverCount];             //一个子动作下，所有舵机的角度列表            
            List<int[]> behavior1 = new List<int[]>();
            behavior1.Add(angles1);                             //子动作添加到动作组里
            sover_allAngles.Add(behavior1);                     //动作组添加到总动作列表里

            List<string> one_active2 = new List<string>();      //默认添加四组最常用动作
            one_active2.Add("后退动作");
            one_active2.Add("动作" + one_active2.Count);
            sover_actives.Add(one_active2);
            int[] angles2 = new int[maxSoverCount];
            List<int[]> behavior2 = new List<int[]>();
            behavior2.Add(angles2);
            sover_allAngles.Add(behavior2);

            List<string> one_active3 = new List<string>();
            one_active3.Add("左转动作");
            one_active3.Add("动作" + one_active3.Count);
            sover_actives.Add(one_active3);
            int[] angles3 = new int[maxSoverCount];
            List<int[]> behavior3 = new List<int[]>();
            behavior3.Add(angles3);
            sover_allAngles.Add(behavior3);

            List<string> one_active4 = new List<string>();
            one_active4.Add("右转动作");
            one_active4.Add("动作" + one_active4.Count);
            sover_actives.Add(one_active4);
            int[] angles4 = new int[maxSoverCount];
            List<int[]> behavior4 = new List<int[]>();
            behavior4.Add(angles4);
            sover_allAngles.Add(behavior4);

            for (int i = 0; i < maxSoverCount; i++)
            {
                angles1[i] = 0;
                angles2[i] = 0;
                angles3[i] = 0;
                angles4[i] = 0;
            }
        }

        public string saveCode()
        {
            string code = "#ifndef __SOVER_DATA_CODE_H__ \r\n#define __SOVER_DATA_CODE_H__\r\n\r\n";
            code += "//数组结构{ID0,角度0,ID1,角度1,……}\r\n\r\n";
            //遍历所有动作
            for (int i = 0; i < sover_actives.Count; i++)
            {
                List<string> item = sover_actives[i];
                code += "unsigned char static " + "actives" + i + "[] = { //" + item[0] + "\r\n";  //动作的名字
                //sover_allAngles
                //soverBaseSettings
                for (int j = 0; j < sover_allAngles[i].Count; j++)
                {
                    for (int k = 0; k < sover_allAngles[i][j].Length; k++)
                    {
                        code += soverBaseSettings[k].ID + ",";
                       code += "0x" + sover_allAngles[i][j][soverBaseSettings[k].index].ToString("X2") + ", ";
                    }
                    code += "\r\n";
                }
                code += "};\r\n\r\n#endif \r\n\r\n";
            }
            return code;
        }
    }
}
